# Load Libraries
packages <- c(
  'ggplot2','tidyverse','plotly','leaflet',
  'shiny','shinyWidgets','shinydashboard',
  'xts','forecast','TTR',
  'DT','lubridate','RColorBrewer','scales','stopwords',
  'tidytext','stringr','wordcloud','wordcloud2',
  'SnowballC','textmineR','topicmodels','textclean','tm'
)
for (package in packages) { 
  if (!require(package, character.only = T, quietly = T)) {
    install.packages(package)
    library(package, character.only = T)
  }
}
# Load data
crm <- read_csv("CRM_interacions_table.csv")
gift <- read_csv("gift_transactions_table.csv")
video <- read_csv("video_email_data_table.csv")
constituent <- read_csv("constituent_profiles_table.csv")

Data Exploration

CRM Exploration

## CRM Interaction Type
g <- crm %>%
        group_by(CRM_INTERACTION_TYPE) %>%
        summarise(Total = n()) %>%
        select(CRM_INTERACTION_TYPE, Total) %>%
        ggplot(aes(x = reorder(CRM_INTERACTION_TYPE,Total) ,y = Total))  +
        geom_bar(stat = "identity",width = 0.5, fill='black')  +
        scale_y_continuous(labels = scales::comma) +
        labs(x ="CRM Interaction Type", y = "Count") + coord_flip() +
        theme(legend.text = element_text(size = 12),
              legend.title = element_text(size = 12),
              axis.title = element_text(size = 14),
              axis.text = element_text(size = 12))
      
ggplotly(g)

CRM Interaction Over Time

crm <- crm %>%
        mutate(Year = lubridate::year(CRM_INTERACTION_DATE),
               Quarter = lubridate::quarter(CRM_INTERACTION_DATE),
               Month = lubridate::month(CRM_INTERACTION_DATE, label = TRUE),
               DOW = lubridate::wday(CRM_INTERACTION_DATE, label=TRUE))

CRM Interaction by Year

crm_year <- crm %>%
group_by(Year, CRM_INTERACTION_TYPE) %>%
        summarise(Total = n()) %>%
        select(Year,CRM_INTERACTION_TYPE, Total)

   g <- ggplot(crm_year, aes(as.factor(Year), Total, group=CRM_INTERACTION_TYPE, colour = CRM_INTERACTION_TYPE)) + 
      geom_line( linewidth=1) + theme_minimal() +
      labs(x = "Year", y = "Total", color="CRM Interaction Type") + 
      scale_y_continuous(labels = comma) +
      theme(legend.text = element_text(size = 10),
            legend.title = element_text(size = 10),
            axis.title = element_text(size = 10),
            axis.text = element_text(size = 10),
            axis.text.x = element_text(angle = 0, hjust = 1))
ggplotly(g)

CRM Interaction by Quarter

crm %>%
group_by(Quarter, CRM_INTERACTION_TYPE) %>%
        summarise(Total = n()) %>%
        select(Quarter,CRM_INTERACTION_TYPE, Total) %>% 
      ggplot(aes(as.factor(Quarter), Total, group=CRM_INTERACTION_TYPE, colour = CRM_INTERACTION_TYPE)) + 
      geom_line( linewidth=1) + theme_minimal() +
      labs(x = "Quarter", y = "Total", color="CRM Interaction Type") + 
      scale_y_continuous(labels = comma) +
      theme(legend.text = element_text(size = 10),
            legend.title = element_text(size = 10),
            axis.title = element_text(size = 10),
            axis.text = element_text(size = 10),
            axis.text.x = element_text(angle = 0, hjust = 1))

CRM Interaction by Month

crm %>%
group_by(Month, CRM_INTERACTION_TYPE) %>%
        summarise(Total = n()) %>%
        select(Month,CRM_INTERACTION_TYPE, Total) %>% 
      ggplot(aes(as.factor(Month), Total, group=CRM_INTERACTION_TYPE, colour = CRM_INTERACTION_TYPE)) + 
      geom_line( linewidth=1) + theme_minimal() +
      labs(x = "Quarter", y = "Total", color="CRM Interaction Type") + 
      scale_y_continuous(labels = comma) +
      theme(legend.text = element_text(size = 10),
            legend.title = element_text(size = 10),
            axis.title = element_text(size = 10),
            axis.text = element_text(size = 10),
            axis.text.x = element_text(angle = 0, hjust = 1))

CRM Interaction by Day of Week

crm %>%
group_by(DOW, CRM_INTERACTION_TYPE) %>%
        summarise(Total = n()) %>%
        select(DOW,CRM_INTERACTION_TYPE, Total) %>% 
      ggplot(aes(as.factor(DOW), Total, group=CRM_INTERACTION_TYPE, colour = CRM_INTERACTION_TYPE)) + 
      geom_line( linewidth=1) + theme_minimal() +
      labs(x = "Day of Week", y = "Total", color="CRM Interaction Type") + 
      scale_y_continuous(labels = comma) +
      theme(legend.text = element_text(size = 10),
            legend.title = element_text(size = 10),
            axis.title = element_text(size = 10),
            axis.text = element_text(size = 10),
            axis.text.x = element_text(angle = 0, hjust = 1))

LS0tCnRpdGxlOiAiQXByYSBEYXRhIFNjaWVuY2UgQ2hhbGxlbmdlIDIwMjUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojIExvYWQgTGlicmFyaWVzCnBhY2thZ2VzIDwtIGMoCiAgJ2dncGxvdDInLCd0aWR5dmVyc2UnLCdwbG90bHknLCdsZWFmbGV0JywKICAnc2hpbnknLCdzaGlueVdpZGdldHMnLCdzaGlueWRhc2hib2FyZCcsCiAgJ3h0cycsJ2ZvcmVjYXN0JywnVFRSJywKICAnRFQnLCdsdWJyaWRhdGUnLCdSQ29sb3JCcmV3ZXInLCdzY2FsZXMnLCdzdG9wd29yZHMnLAogICd0aWR5dGV4dCcsJ3N0cmluZ3InLCd3b3JkY2xvdWQnLCd3b3JkY2xvdWQyJywKICAnU25vd2JhbGxDJywndGV4dG1pbmVSJywndG9waWNtb2RlbHMnLCd0ZXh0Y2xlYW4nLCd0bScKKQpmb3IgKHBhY2thZ2UgaW4gcGFja2FnZXMpIHsgCiAgaWYgKCFyZXF1aXJlKHBhY2thZ2UsIGNoYXJhY3Rlci5vbmx5ID0gVCwgcXVpZXRseSA9IFQpKSB7CiAgICBpbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2UpCiAgICBsaWJyYXJ5KHBhY2thZ2UsIGNoYXJhY3Rlci5vbmx5ID0gVCkKICB9Cn0KYGBgCgoKYGBge3J9CiMgTG9hZCBkYXRhCmNybSA8LSByZWFkX2NzdigiQ1JNX2ludGVyYWNpb25zX3RhYmxlLmNzdiIpCmdpZnQgPC0gcmVhZF9jc3YoImdpZnRfdHJhbnNhY3Rpb25zX3RhYmxlLmNzdiIpCnZpZGVvIDwtIHJlYWRfY3N2KCJ2aWRlb19lbWFpbF9kYXRhX3RhYmxlLmNzdiIpCmNvbnN0aXR1ZW50IDwtIHJlYWRfY3N2KCJjb25zdGl0dWVudF9wcm9maWxlc190YWJsZS5jc3YiKQpgYGAKCiMgRGF0YSBFeHBsb3JhdGlvbgoKIyMgQ1JNIEV4cGxvcmF0aW9uCmBgYHtyfQojIyBDUk0gSW50ZXJhY3Rpb24gVHlwZQpnIDwtIGNybSAlPiUKICAgICAgICBncm91cF9ieShDUk1fSU5URVJBQ1RJT05fVFlQRSkgJT4lCiAgICAgICAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUKICAgICAgICBzZWxlY3QoQ1JNX0lOVEVSQUNUSU9OX1RZUEUsIFRvdGFsKSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKENSTV9JTlRFUkFDVElPTl9UWVBFLFRvdGFsKSAseSA9IFRvdGFsKSkgICsKICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iix3aWR0aCA9IDAuNSwgZmlsbD0nYmxhY2snKSAgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArCiAgICAgICAgbGFicyh4ID0iQ1JNIEludGVyYWN0aW9uIFR5cGUiLCB5ID0gIkNvdW50IikgKyBjb29yZF9mbGlwKCkgKwogICAgICAgIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQogICAgICAKZ2dwbG90bHkoZykKYGBgCgoKIyMjIENSTSBJbnRlcmFjdGlvbiBPdmVyIFRpbWUKYGBge3J9CmNybSA8LSBjcm0gJT4lCiAgICAgICAgbXV0YXRlKFllYXIgPSBsdWJyaWRhdGU6OnllYXIoQ1JNX0lOVEVSQUNUSU9OX0RBVEUpLAogICAgICAgICAgICAgICBRdWFydGVyID0gbHVicmlkYXRlOjpxdWFydGVyKENSTV9JTlRFUkFDVElPTl9EQVRFKSwKICAgICAgICAgICAgICAgTW9udGggPSBsdWJyaWRhdGU6Om1vbnRoKENSTV9JTlRFUkFDVElPTl9EQVRFLCBsYWJlbCA9IFRSVUUpLAogICAgICAgICAgICAgICBET1cgPSBsdWJyaWRhdGU6OndkYXkoQ1JNX0lOVEVSQUNUSU9OX0RBVEUsIGxhYmVsPVRSVUUpKQpgYGAKCiMjIyMgQ1JNIEludGVyYWN0aW9uIGJ5IFllYXIKYGBge3J9CmNybV95ZWFyIDwtIGNybSAlPiUKZ3JvdXBfYnkoWWVhciwgQ1JNX0lOVEVSQUNUSU9OX1RZUEUpICU+JQogICAgICAgIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lCiAgICAgICAgc2VsZWN0KFllYXIsQ1JNX0lOVEVSQUNUSU9OX1RZUEUsIFRvdGFsKQoKICAgZyA8LSBnZ3Bsb3QoY3JtX3llYXIsIGFlcyhhcy5mYWN0b3IoWWVhciksIFRvdGFsLCBncm91cD1DUk1fSU5URVJBQ1RJT05fVFlQRSwgY29sb3VyID0gQ1JNX0lOVEVSQUNUSU9OX1RZUEUpKSArIAogICAgICBnZW9tX2xpbmUoIGxpbmV3aWR0aD0xKSArIHRoZW1lX21pbmltYWwoKSArCiAgICAgIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJUb3RhbCIsIGNvbG9yPSJDUk0gSW50ZXJhY3Rpb24gVHlwZSIpICsgCiAgICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogICAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQpnZ3Bsb3RseShnKQpgYGAKCiMjIyMgQ1JNIEludGVyYWN0aW9uIGJ5IFF1YXJ0ZXIKYGBge3J9CmNybSAlPiUKZ3JvdXBfYnkoUXVhcnRlciwgQ1JNX0lOVEVSQUNUSU9OX1RZUEUpICU+JQogICAgICAgIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lCiAgICAgICAgc2VsZWN0KFF1YXJ0ZXIsQ1JNX0lOVEVSQUNUSU9OX1RZUEUsIFRvdGFsKSAlPiUgCiAgICAgIGdncGxvdChhZXMoYXMuZmFjdG9yKFF1YXJ0ZXIpLCBUb3RhbCwgZ3JvdXA9Q1JNX0lOVEVSQUNUSU9OX1RZUEUsIGNvbG91ciA9IENSTV9JTlRFUkFDVElPTl9UWVBFKSkgKyAKICAgICAgZ2VvbV9saW5lKCBsaW5ld2lkdGg9MSkgKyB0aGVtZV9taW5pbWFsKCkgKwogICAgICBsYWJzKHggPSAiUXVhcnRlciIsIHkgPSAiVG90YWwiLCBjb2xvcj0iQ1JNIEludGVyYWN0aW9uIFR5cGUiKSArIAogICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsKICAgICAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAxKSkKCmBgYAoKIyMjIyBDUk0gSW50ZXJhY3Rpb24gYnkgTW9udGgKYGBge3J9CmNybSAlPiUKZ3JvdXBfYnkoTW9udGgsIENSTV9JTlRFUkFDVElPTl9UWVBFKSAlPiUKICAgICAgICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JQogICAgICAgIHNlbGVjdChNb250aCxDUk1fSU5URVJBQ1RJT05fVFlQRSwgVG90YWwpICU+JSAKICAgICAgZ2dwbG90KGFlcyhhcy5mYWN0b3IoTW9udGgpLCBUb3RhbCwgZ3JvdXA9Q1JNX0lOVEVSQUNUSU9OX1RZUEUsIGNvbG91ciA9IENSTV9JTlRFUkFDVElPTl9UWVBFKSkgKyAKICAgICAgZ2VvbV9saW5lKCBsaW5ld2lkdGg9MSkgKyB0aGVtZV9taW5pbWFsKCkgKwogICAgICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlRvdGFsIiwgY29sb3I9IkNSTSBJbnRlcmFjdGlvbiBUeXBlIikgKyAKICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgICAgIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMSkpCmBgYAoKCiMjIyMgQ1JNIEludGVyYWN0aW9uIGJ5IERheSBvZiBXZWVrCmBgYHtyfQpjcm0gJT4lCmdyb3VwX2J5KERPVywgQ1JNX0lOVEVSQUNUSU9OX1RZUEUpICU+JQogICAgICAgIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lCiAgICAgICAgc2VsZWN0KERPVyxDUk1fSU5URVJBQ1RJT05fVFlQRSwgVG90YWwpICU+JSAKICAgICAgZ2dwbG90KGFlcyhhcy5mYWN0b3IoRE9XKSwgVG90YWwsIGdyb3VwPUNSTV9JTlRFUkFDVElPTl9UWVBFLCBjb2xvdXIgPSBDUk1fSU5URVJBQ1RJT05fVFlQRSkpICsgCiAgICAgIGdlb21fbGluZSggbGluZXdpZHRoPTEpICsgdGhlbWVfbWluaW1hbCgpICsKICAgICAgbGFicyh4ID0gIkRheSBvZiBXZWVrIiwgeSA9ICJUb3RhbCIsIGNvbG9yPSJDUk0gSW50ZXJhY3Rpb24gVHlwZSIpICsgCiAgICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKwogICAgICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDEpKQpgYGAKCg==